Skip to content

helm chart upgrade --skip-pipeline#2452

Merged
akshaydeo merged 1 commit intov1.5.0from
04-01-helm_chart_upgrade
Apr 1, 2026
Merged

helm chart upgrade --skip-pipeline#2452
akshaydeo merged 1 commit intov1.5.0from
04-01-helm_chart_upgrade

Conversation

@akshaydeo
Copy link
Copy Markdown
Contributor

@akshaydeo akshaydeo commented Apr 1, 2026

Summary

Bumped Bifrost Helm chart to version 2.0.15 with comprehensive schema synchronization and new configuration options for MCP, governance, and WebSocket functionality.

Changes

  • Schema Synchronization: Added missing properties from transport config.schema.json:

    • client.mcpDisableAutoToolInject for disabling automatic MCP tool injection
    • governance.budgets[].calendar_aligned for snapping budget resets to calendar boundaries
    • governance.pricingOverrides for scoped pricing overrides in the model catalog
    • mcp.clientConfigs[].allowedExtraHeaders for header allowlists per MCP client
    • mcp.clientConfigs[].allowOnAllVirtualKeys for making MCP servers accessible to all virtual keys
    • mcp.toolManagerConfig.disableAutoToolInject for disabling auto tool injection at manager level
    • networkConfig.beta_header_overrides for overriding Anthropic beta header support per provider
    • websocket configuration for full WebSocket gateway tuning (connections, pool, transcript buffer)
  • Template Fixes: Fixed SSE connectionString not being rendered in _helpers.tpl for MCP clients and added template rendering for all new properties

  • Documentation: Updated README.md with detailed changelog for v2.0.15

Type of change

  • Feature
  • Bug fix
  • Refactor
  • Documentation
  • Chore/CI

Affected areas

  • Core (Go)
  • Transports (HTTP)
  • Providers/Integrations
  • Plugins
  • UI (Next.js)
  • Docs

How to test

Validate the Helm chart schema and template rendering:

# Validate chart syntax
helm lint helm-charts/bifrost/

# Test template rendering with new values
helm template test-release helm-charts/bifrost/ \
  --set bifrost.client.mcpDisableAutoToolInject=true \
  --set bifrost.governance.budgets[0].calendar_aligned=true \
  --set bifrost.websocket.maxConnectionsPerUser=50

# Verify schema validation
helm install --dry-run --debug test-release helm-charts/bifrost/

Test the new configuration options:

  • MCP tool injection controls
  • Calendar-aligned budget resets
  • WebSocket connection limits and pooling
  • Pricing overrides functionality

Screenshots/Recordings

N/A - Helm chart configuration changes only.

Breaking changes

  • Yes
  • No

All new properties are optional with sensible defaults.

Related issues

Part of ongoing effort to maintain schema parity between Helm charts and core transport configuration.

Security considerations

  • New allowedExtraHeaders configuration requires careful review to prevent header injection attacks
  • allowOnAllVirtualKeys setting should be used cautiously as it bypasses key-based access controls
  • Pricing overrides could impact billing if misconfigured

Checklist

  • I read docs/contributing/README.md and followed the guidelines
  • I added/updated tests where appropriate
  • I updated documentation where needed
  • I verified builds succeed (Go and UI)
  • I verified the CI pipeline passes locally if applicable

@akshaydeo akshaydeo marked this pull request as ready for review April 1, 2026 09:59
@akshaydeo akshaydeo requested a review from a team as a code owner April 1, 2026 09:59
Copy link
Copy Markdown
Contributor Author

akshaydeo commented Apr 1, 2026

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 1, 2026

📝 Walkthrough

Walkthrough

A Helm chart version bump from 2.0.14 to 2.0.15 introducing new configuration options for MCP auto-tool injection controls, WebSocket gateway tuning, governance pricing overrides, and enhanced client header forwarding capabilities. Schema constraints were relaxed for provider key configurations.

Changes

Cohort / File(s) Summary
Chart Metadata
helm-charts/bifrost/Chart.yaml, helm-charts/index.yaml
Version bumped to 2.0.15 with appVersion 1.4.11. Index file updated with new chart entry and generated timestamp.
Documentation
helm-charts/bifrost/README.md
Updated latest version to 2.0.15. Added changelog entry documenting new MCP injection toggles, governance budget calendar alignment, pricing overrides, header allowlists, and WebSocket tuning features.
Template Logic
helm-charts/bifrost/templates/_helpers.tpl
Extended JSON configuration generation to support MCP auto-tool injection flags, SSE connection string rendering for MCP clients, allowed extra headers forwarding, governance pricing overrides, and WebSocket pool configuration (max connections, transcript buffering, connection timeouts).
Configuration Schema
helm-charts/bifrost/values.schema.json
Added new properties for MCP disable auto-tool inject flags, WebSocket tuning object with pool settings, governance pricing override arrays, beta header overrides, and MCP client header/virtual-key accessibility options. Relaxed required constraints on provider key configuration fields (Azure, Vertex, VLLM endpoints and identifiers).

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~75 minutes

Poem

🐰 Whiskers twitching with delight,
WebSocket pools now tuned just right,
MCP tools inject with grace,
Pricing overrides find their place,
Headers hop from key to key,
Version bumped to 2.0.15! 🎉

🚥 Pre-merge checks | ✅ 2 | ❌ 3

❌ Failed checks (2 warnings, 1 inconclusive)

Check name Status Explanation Resolution
Linked Issues check ⚠️ Warning The linked issue #123 requires Files API support for providers, but the PR contains only Helm chart configuration updates with no changes to implement file upload endpoints or provider file API support. Either implement the Files API support described in issue #123 or update the linked issues to reference only schema synchronization/Helm chart maintenance tasks.
Out of Scope Changes check ⚠️ Warning All code changes are Helm chart configuration updates related to schema synchronization and new features (MCP, governance, WebSocket), but these are unrelated to the linked issue #123 which requires Files API implementation for providers. Remove the link to issue #123 or clarify its relationship to Helm chart changes, as the PR scope (chart upgrades) does not address Files API requirements mentioned in the linked issue.
Title check ❓ Inconclusive The title 'helm chart upgrade --skip-pipeline' is vague and generic, using non-descriptive phrasing that doesn't convey meaningful information about the actual changeset. Clarify the title to reflect the specific Bifrost Helm chart updates: describe the version bump and key feature additions (e.g., 'Bifrost Helm chart v2.0.15: Add MCP, governance, and WebSocket configurations').
✅ Passed checks (2 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Description check ✅ Passed PR description is comprehensive and well-structured, covering summary, changes, type of change, affected areas, testing steps, security considerations, and checklist with all items marked complete.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch 04-01-helm_chart_upgrade

Comment @coderabbitai help to get the list of available commands and usage tips.

@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps Bot commented Apr 1, 2026

Confidence Score: 5/5

Safe to merge; all findings are P2 style/quality suggestions with no blocking issues.

The changes are well-structured and additive. The SSE connection string bug fix is correct. Template helpers consistently use hasKey for boolean fields and truthiness checks for strings/integers, matching the existing pattern. The only concern is the removal of several required constraints in the schema, which loosens Helm-level validation but does not introduce a definite runtime defect in the changed code path — hence P2.

helm-charts/bifrost/values.schema.json — verify that the removed required constraints are intentional (e.g., env-var sourced fields).

Important Files Changed

Filename Overview
helm-charts/bifrost/Chart.yaml Simple version bump from 2.0.14 to 2.0.15; appVersion remains at 1.4.11.
helm-charts/bifrost/README.md Updated latest version reference and added detailed v2.0.15 changelog listing all new properties and bug fixes.
helm-charts/bifrost/templates/_helpers.tpl Added template rendering for new properties (mcpDisableAutoToolInject, pricingOverrides, allowedExtraHeaders, allowOnAllVirtualKeys, disableAutoToolInject, WebSocket config) and fixed SSE connectionString rendering bug.
helm-charts/bifrost/values.schema.json Added schema definitions for new properties and removed several required field constraints from provider-specific key configs and the top-level provider key object.
helm-charts/index.yaml Added v2.0.15 chart entry; empty digest is consistent with all existing entries in this repo.

Reviews (1): Last reviewed commit: "helm chart upgrade" | Re-trigger Greptile

Comment thread helm-charts/bifrost/values.schema.json
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
helm-charts/bifrost/values.schema.json (1)

2891-3075: ⚠️ Potential issue | 🟠 Major

Keep virtualKeyProviderConfig.keys[] aligned with $defs.providerKey.

This nested schema is now looser than the top-level providerKey schema. That weakens Helm validation and defers broken configs to runtime; a nested vertex_key_config can now pass without project_id, even though core/providers/vertex/vertex.go still rejects an empty project_id.

Suggested fix
               "azure_key_config": {
                 "type": "object",
                 "properties": {
                   "endpoint": {
                     "type": "string",
                     "description": "Azure endpoint (can use env. prefix)"
                   },
                   "deployments": {
                     "type": "object",
                     "additionalProperties": {
                       "type": "string"
                     },
                     "description": "Model to deployment mappings"
                   },
                   "api_version": {
                     "type": "string",
                     "description": "Azure API version"
                   }
                 },
+                "required": ["endpoint", "api_version"],
                 "additionalProperties": false
               },
               "vertex_key_config": {
                 "type": "object",
                 "properties": {
                   "project_id": {
                     "type": "string",
                     "description": "Google Cloud project ID (can use env. prefix)"
                   },
                   "project_number": {
                     "type": "string",
                     "description": "Google Cloud project number"
                   },
                   "region": {
                     "type": "string",
                     "description": "Google Cloud region"
                   },
                   "auth_credentials": {
                     "type": "string",
                     "description": "Authentication credentials (can use env. prefix)"
                   },
                   "deployments": {
                     "type": "object",
                     "additionalProperties": {
                       "type": "string"
                     },
                     "description": "Model to deployment mappings"
                   }
                 },
+                "required": ["project_id", "region"],
                 "additionalProperties": false
               },
               "vllm_key_config": {
                 "type": "object",
                 "properties": {
                   "url": {
                     "type": "string",
                     "description": "VLLM server base URL (can use env. prefix)"
                   },
                   "model_name": {
                     "type": "string",
                     "description": "Exact model name served on this VLLM instance"
                   }
                 },
+                "required": ["url", "model_name"],
                 "additionalProperties": false
               }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@helm-charts/bifrost/values.schema.json` around lines 2891 - 3075, The nested
schema virtualKeyProviderConfig.keys[] is looser than the top-level
$defs.providerKey and allows missing required fields (e.g.,
vertex_key_config.project_id) that the runtime (core/providers/vertex/vertex.go)
expects; fix it by making the keys[] item schema reference the canonical
providerKey ($ref to $defs.providerKey) or by copying the exact
properties/required constraints from $defs.providerKey into the keys[] item so
both schemas are identical (ensure vertex_key_config requires
project_id/project_number/region as in providerKey).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@helm-charts/bifrost/README.md`:
- Line 7: The README advertises "Latest Version: 2.0.15" but install/upgrade
snippets still pin mixed image tags (e.g., v1.4.3, v1.5.0, v1.5.2); update those
snippets to either remove explicit image tags or change them to match the
chart's appVersion (appVersion: 1.4.11) so copy/paste installs deploy the
expected app version—search for the image tag strings (v1.4.3, v1.5.0, v1.5.2)
in README.md and replace them with either no tag (let the chart default) or with
v1.4.11 and ensure the "Latest Version: 2.0.15" header remains correct.

In `@helm-charts/bifrost/values.schema.json`:
- Around line 1231-1263: The pricingOverrides item schema currently only
documents virtual_key_id, provider_id, and provider_key_id but does not enforce
them for specific scope_kind values; add JSON Schema conditional rules under the
pricingOverrides->items object using "if"/"then" (or "oneOf" alternatives) that
require virtual_key_id when scope_kind is "virtual_key" or starts with
"virtual_key", require provider_id when scope_kind is "provider" or includes
"provider", and require provider_key_id for "provider_key" and
"virtual_key_provider_key"; ensure these conditions reference the existing
"scope_kind" discriminator and add appropriate required arrays so an object with
scope_kind "virtual_key_provider_key" cannot validate without all three IDs
(virtual_key_id, provider_id, provider_key_id).

In `@helm-charts/index.yaml`:
- Around line 4-24: The index entry for version 2.0.15 was hand-edited and has
an empty digest and mismatched metadata; regenerate the index from the packaged
chart artifact (bifrost-2.0.15.tgz) so the digest is computed and the entry
fields (maintainers/email, icon URL, home, etc.) match the chart’s Chart.yaml
values (e.g., support@getbifrost.ai and getbifrost.ai/favicon.png). Re-run the
helm repo index generation against the chart (or the CI step that produced the
package) to replace the manual entry for version 2.0.15 with the canonical data
extracted from the tarball.

---

Outside diff comments:
In `@helm-charts/bifrost/values.schema.json`:
- Around line 2891-3075: The nested schema virtualKeyProviderConfig.keys[] is
looser than the top-level $defs.providerKey and allows missing required fields
(e.g., vertex_key_config.project_id) that the runtime
(core/providers/vertex/vertex.go) expects; fix it by making the keys[] item
schema reference the canonical providerKey ($ref to $defs.providerKey) or by
copying the exact properties/required constraints from $defs.providerKey into
the keys[] item so both schemas are identical (ensure vertex_key_config requires
project_id/project_number/region as in providerKey).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: f0cd08ef-aa94-4a52-9c7f-ecb146200a7c

📥 Commits

Reviewing files that changed from the base of the PR and between dee8e7d and dd515b6.

📒 Files selected for processing (5)
  • helm-charts/bifrost/Chart.yaml
  • helm-charts/bifrost/README.md
  • helm-charts/bifrost/templates/_helpers.tpl
  • helm-charts/bifrost/values.schema.json
  • helm-charts/index.yaml

Official Helm charts for deploying [Bifrost](https://github.com/maximhq/bifrost) - a high-performance AI gateway with unified interface for multiple providers.

**Latest Version:** 2.0.14
**Latest Version:** 2.0.15
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Update the example image tags alongside the chart bump.

The README now advertises 2.0.15, but several install/upgrade snippets in this file still pin mixed image tags (v1.4.3, v1.5.0, v1.5.2). Either align them with appVersion: 1.4.11 or drop the explicit tag so copy/paste installs do not silently deploy a different app version.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@helm-charts/bifrost/README.md` at line 7, The README advertises "Latest
Version: 2.0.15" but install/upgrade snippets still pin mixed image tags (e.g.,
v1.4.3, v1.5.0, v1.5.2); update those snippets to either remove explicit image
tags or change them to match the chart's appVersion (appVersion: 1.4.11) so
copy/paste installs deploy the expected app version—search for the image tag
strings (v1.4.3, v1.5.0, v1.5.2) in README.md and replace them with either no
tag (let the chart default) or with v1.4.11 and ensure the "Latest Version:
2.0.15" header remains correct.

Comment on lines +1231 to +1263
"pricingOverrides": {
"type": "array",
"description": "Scoped pricing overrides applied at runtime by the model catalog",
"items": {
"type": "object",
"properties": {
"id": { "type": "string", "description": "Unique pricing override ID" },
"name": { "type": "string", "description": "Human-readable name for this override" },
"scope_kind": {
"type": "string",
"enum": ["global", "provider", "provider_key", "virtual_key", "virtual_key_provider", "virtual_key_provider_key"],
"description": "Scope level for this override"
},
"virtual_key_id": { "type": "string", "description": "Virtual key ID (required for virtual_key* scopes)" },
"provider_id": { "type": "string", "description": "Provider ID (required for provider* scopes)" },
"provider_key_id": { "type": "string", "description": "Provider key ID (required for provider_key and virtual_key_provider_key scopes)" },
"match_type": {
"type": "string",
"enum": ["exact", "wildcard"],
"description": "How the pattern is matched against model names"
},
"pattern": { "type": "string", "description": "Model name pattern to match" },
"request_types": {
"type": "array",
"minItems": 1,
"items": { "type": "string" },
"description": "Request types this override applies to"
},
"pricing_patch": { "type": "string", "description": "JSON-encoded pricing fields to override" },
"config_hash": { "type": "string", "description": "Internal hash for change detection (auto-managed)" }
},
"required": ["id", "name", "scope_kind", "match_type", "pattern", "request_types"]
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Enforce the scope-specific IDs in pricingOverrides.

virtual_key_id, provider_id, and provider_key_id are only documented in descriptions right now. A scope_kind: "virtual_key_provider_key" object with none of those fields still passes schema validation, so Helm will accept an override that cannot be resolved unambiguously.

Suggested schema tightening
             "pricingOverrides": {
               "type": "array",
               "description": "Scoped pricing overrides applied at runtime by the model catalog",
               "items": {
                 "type": "object",
                 "properties": {
                   "id": { "type": "string", "description": "Unique pricing override ID" },
                   "name": { "type": "string", "description": "Human-readable name for this override" },
                   "scope_kind": {
                     "type": "string",
                     "enum": ["global", "provider", "provider_key", "virtual_key", "virtual_key_provider", "virtual_key_provider_key"],
                     "description": "Scope level for this override"
                   },
                   "virtual_key_id": { "type": "string", "description": "Virtual key ID (required for virtual_key* scopes)" },
                   "provider_id": { "type": "string", "description": "Provider ID (required for provider* scopes)" },
                   "provider_key_id": { "type": "string", "description": "Provider key ID (required for provider_key and virtual_key_provider_key scopes)" },
                   "match_type": {
                     "type": "string",
                     "enum": ["exact", "wildcard"],
                     "description": "How the pattern is matched against model names"
                   },
                   "pattern": { "type": "string", "description": "Model name pattern to match" },
                   "request_types": {
                     "type": "array",
                     "minItems": 1,
                     "items": { "type": "string" },
                     "description": "Request types this override applies to"
                   },
                   "pricing_patch": { "type": "string", "description": "JSON-encoded pricing fields to override" },
                   "config_hash": { "type": "string", "description": "Internal hash for change detection (auto-managed)" }
                 },
-                "required": ["id", "name", "scope_kind", "match_type", "pattern", "request_types"]
+                "required": ["id", "name", "scope_kind", "match_type", "pattern", "request_types"],
+                "allOf": [
+                  {
+                    "if": {
+                      "properties": {
+                        "scope_kind": {
+                          "enum": ["provider", "provider_key", "virtual_key_provider", "virtual_key_provider_key"]
+                        }
+                      },
+                      "required": ["scope_kind"]
+                    },
+                    "then": {
+                      "required": ["provider_id"]
+                    }
+                  },
+                  {
+                    "if": {
+                      "properties": {
+                        "scope_kind": {
+                          "enum": ["virtual_key", "virtual_key_provider", "virtual_key_provider_key"]
+                        }
+                      },
+                      "required": ["scope_kind"]
+                    },
+                    "then": {
+                      "required": ["virtual_key_id"]
+                    }
+                  },
+                  {
+                    "if": {
+                      "properties": {
+                        "scope_kind": {
+                          "enum": ["provider_key", "virtual_key_provider_key"]
+                        }
+                      },
+                      "required": ["scope_kind"]
+                    },
+                    "then": {
+                      "required": ["provider_key_id"]
+                    }
+                  }
+                ]
               }
             }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"pricingOverrides": {
"type": "array",
"description": "Scoped pricing overrides applied at runtime by the model catalog",
"items": {
"type": "object",
"properties": {
"id": { "type": "string", "description": "Unique pricing override ID" },
"name": { "type": "string", "description": "Human-readable name for this override" },
"scope_kind": {
"type": "string",
"enum": ["global", "provider", "provider_key", "virtual_key", "virtual_key_provider", "virtual_key_provider_key"],
"description": "Scope level for this override"
},
"virtual_key_id": { "type": "string", "description": "Virtual key ID (required for virtual_key* scopes)" },
"provider_id": { "type": "string", "description": "Provider ID (required for provider* scopes)" },
"provider_key_id": { "type": "string", "description": "Provider key ID (required for provider_key and virtual_key_provider_key scopes)" },
"match_type": {
"type": "string",
"enum": ["exact", "wildcard"],
"description": "How the pattern is matched against model names"
},
"pattern": { "type": "string", "description": "Model name pattern to match" },
"request_types": {
"type": "array",
"minItems": 1,
"items": { "type": "string" },
"description": "Request types this override applies to"
},
"pricing_patch": { "type": "string", "description": "JSON-encoded pricing fields to override" },
"config_hash": { "type": "string", "description": "Internal hash for change detection (auto-managed)" }
},
"required": ["id", "name", "scope_kind", "match_type", "pattern", "request_types"]
}
"pricingOverrides": {
"type": "array",
"description": "Scoped pricing overrides applied at runtime by the model catalog",
"items": {
"type": "object",
"properties": {
"id": { "type": "string", "description": "Unique pricing override ID" },
"name": { "type": "string", "description": "Human-readable name for this override" },
"scope_kind": {
"type": "string",
"enum": ["global", "provider", "provider_key", "virtual_key", "virtual_key_provider", "virtual_key_provider_key"],
"description": "Scope level for this override"
},
"virtual_key_id": { "type": "string", "description": "Virtual key ID (required for virtual_key* scopes)" },
"provider_id": { "type": "string", "description": "Provider ID (required for provider* scopes)" },
"provider_key_id": { "type": "string", "description": "Provider key ID (required for provider_key and virtual_key_provider_key scopes)" },
"match_type": {
"type": "string",
"enum": ["exact", "wildcard"],
"description": "How the pattern is matched against model names"
},
"pattern": { "type": "string", "description": "Model name pattern to match" },
"request_types": {
"type": "array",
"minItems": 1,
"items": { "type": "string" },
"description": "Request types this override applies to"
},
"pricing_patch": { "type": "string", "description": "JSON-encoded pricing fields to override" },
"config_hash": { "type": "string", "description": "Internal hash for change detection (auto-managed)" }
},
"required": ["id", "name", "scope_kind", "match_type", "pattern", "request_types"],
"allOf": [
{
"if": {
"properties": {
"scope_kind": {
"enum": ["provider", "provider_key", "virtual_key_provider", "virtual_key_provider_key"]
}
},
"required": ["scope_kind"]
},
"then": {
"required": ["provider_id"]
}
},
{
"if": {
"properties": {
"scope_kind": {
"enum": ["virtual_key", "virtual_key_provider", "virtual_key_provider_key"]
}
},
"required": ["scope_kind"]
},
"then": {
"required": ["virtual_key_id"]
}
},
{
"if": {
"properties": {
"scope_kind": {
"enum": ["provider_key", "virtual_key_provider_key"]
}
},
"required": ["scope_kind"]
},
"then": {
"required": ["provider_key_id"]
}
}
]
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@helm-charts/bifrost/values.schema.json` around lines 1231 - 1263, The
pricingOverrides item schema currently only documents virtual_key_id,
provider_id, and provider_key_id but does not enforce them for specific
scope_kind values; add JSON Schema conditional rules under the
pricingOverrides->items object using "if"/"then" (or "oneOf" alternatives) that
require virtual_key_id when scope_kind is "virtual_key" or starts with
"virtual_key", require provider_id when scope_kind is "provider" or includes
"provider", and require provider_key_id for "provider_key" and
"virtual_key_provider_key"; ensure these conditions reference the existing
"scope_kind" discriminator and add appropriate required arrays so an object with
scope_kind "virtual_key_provider_key" cannot validate without all three IDs
(virtual_key_id, provider_id, provider_key_id).

Comment thread helm-charts/index.yaml
Comment on lines +4 to +24
- apiVersion: v2
appVersion: 1.4.11
created: "2026-04-01T12:00:00.000000+00:00"
description: A Helm chart for deploying Bifrost - AI Gateway with unified interface for multiple providers
digest: ""
home: https://www.getmaxim.ai/bifrost
icon: https://www.getmaxim.ai/bifrost/bifrost-logo-only.png
keywords:
- ai
- gateway
- llm
maintainers:
- email: akshay@getmaxim.ai
name: Bifrost Team
name: bifrost
sources:
- https://github.com/maximhq/bifrost
type: application
urls:
- https://maximhq.github.io/bifrost/helm-charts/bifrost-2.0.15.tgz
version: 2.0.15
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

python - <<'PY'
from pathlib import Path

chart_lines = Path("helm-charts/bifrost/Chart.yaml").read_text().splitlines()
index_lines = Path("helm-charts/index.yaml").read_text().splitlines()

def scalar(lines, key):
    prefix = f"{key}:"
    for line in lines:
        stripped = line.strip()
        if stripped.startswith(prefix):
            return stripped.split(":", 1)[1].strip().strip('"')
    return None

def maintainer_email(lines):
    in_maintainers = False
    for line in lines:
        stripped = line.strip()
        if stripped == "maintainers:":
            in_maintainers = True
            continue
        if in_maintainers:
            if stripped.startswith("email:") or stripped.startswith("- email:"):
                return stripped.split(":", 1)[1].strip()
            if stripped and not stripped.startswith("-") and not stripped.startswith("name:") and not stripped.startswith("email:"):
                break
    return None

def extract_index_block(lines, version):
    for i, line in enumerate(lines):
        if line.strip() == f"version: {version}":
            start = i
            while start >= 0 and not lines[start].startswith("  - apiVersion:"):
                start -= 1
            end = i
            while end + 1 < len(lines) and not lines[end + 1].startswith("  - apiVersion:") and not lines[end + 1].startswith("generated:"):
                end += 1
            return lines[start:end + 1]
    raise SystemExit(f"ERROR: version {version} not found in helm-charts/index.yaml")

block = extract_index_block(index_lines, "2.0.15")

chart_email = maintainer_email(chart_lines)
index_email = maintainer_email(block)
chart_icon = scalar(chart_lines, "icon")
index_icon = scalar(block, "icon")
index_digest = scalar(block, "digest")

print("Chart.yaml maintainer email:", chart_email)
print("index.yaml maintainer email:", index_email)
print("Chart.yaml icon:", chart_icon)
print("index.yaml icon:", index_icon)
print("index.yaml digest:", index_digest)

mismatches = []
if chart_email != index_email:
    mismatches.append("maintainer email mismatch")
if chart_icon != index_icon:
    mismatches.append("icon mismatch")
if not index_digest:
    mismatches.append("index digest is empty")

if mismatches:
    for item in mismatches:
        print("ERROR:", item)
    raise SystemExit(1)
PY

pkg="$(find . -name 'bifrost-2.0.15.tgz' -print | head -n 1)"
if [ -z "$pkg" ]; then
  echo "ERROR: packaged chart bifrost-2.0.15.tgz is missing"
  exit 1
fi

echo "Packaged chart found: $pkg"
sha256sum "$pkg"

Repository: maximhq/bifrost

Length of output: 386


Regenerate the 2.0.15 index entry from the packaged chart.

The digest field is empty, and the maintainer email and icon URL in the index entry do not match helm-charts/bifrost/Chart.yaml (index has akshay@getmaxim.ai and getmaxim.ai/bifrost/bifrost-logo-only.png while Chart.yaml has support@getbifrost.ai and getbifrost.ai/favicon.png). This indicates the repo index was hand-edited instead of rebuilt from the actual bifrost-2.0.15.tgz artifact, which can cause published metadata to drift from what users install. If the packaging step occurs elsewhere in this Graphite stack, keep this out-of-sync only temporarily.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@helm-charts/index.yaml` around lines 4 - 24, The index entry for version
2.0.15 was hand-edited and has an empty digest and mismatched metadata;
regenerate the index from the packaged chart artifact (bifrost-2.0.15.tgz) so
the digest is computed and the entry fields (maintainers/email, icon URL, home,
etc.) match the chart’s Chart.yaml values (e.g., support@getbifrost.ai and
getbifrost.ai/favicon.png). Re-run the helm repo index generation against the
chart (or the CI step that produced the package) to replace the manual entry for
version 2.0.15 with the canonical data extracted from the tarball.

@akshaydeo akshaydeo changed the title helm chart upgrade helm chart upgrade --skip-pipeline Apr 1, 2026
Copy link
Copy Markdown
Contributor Author

akshaydeo commented Apr 1, 2026

Merge activity

  • Apr 1, 11:11 AM UTC: A user started a stack merge that includes this pull request via Graphite.
  • Apr 1, 11:12 AM UTC: @akshaydeo merged this pull request with Graphite.

@akshaydeo akshaydeo merged commit 39c7555 into v1.5.0 Apr 1, 2026
14 of 20 checks passed
@akshaydeo akshaydeo deleted the 04-01-helm_chart_upgrade branch April 1, 2026 11:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant